package com.jiangxjsy.gateway.router;

import com.jiangxjsy.gateway.service.database.GatewayRouteService;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import javax.annotation.Resource;

/**
 * wukong-crm-master
 * 蒋胜宇
 * 2025/5/31 13:38
 *
 * <p>
 * 自定义路由仓库
 * </p>
 *
 * <p>
 * 整体流程：
 * service.database.GatewayRouteService 在程序启动时从数据库中加载路由配置
 * 并存储在 ROUTES 中，并提供对其的相关操作方法，以供获取路由定义。
 * router.RouteRepository 从 service.database.GatewayRouteService 中获取路由定义，创建路由配置
 * 该自定义路由仓库实现效果类似于在 application.yml 中配置的路由配置，
 * 即类似于：
 * spring:
 *   cloud:
 *     gateway:
 *       routes:
 *         - id: routeId
 *           uri: uri
 * 也就是说，该自定义路由仓库会从数据库中加载路由配置，并创建路由定义，从而实现动态路由的功能。
 * 从而不需要在 application.yml 中配置路由，而直接从数据库中加载路由配置。
 * </p>
 */

@Component
public class RouteRepository implements RouteDefinitionRepository {
    @Resource
    private GatewayRouteService gatewayRouteService;

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        return Flux.fromIterable(gatewayRouteService.getRouteDefinitions());
    }

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return route.flatMap(routeDefinition -> {
            gatewayRouteService.saveRoute(routeDefinition);
            return Mono.empty();
        });
    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        return routeId.flatMap(id -> {
            gatewayRouteService.removeRoute(id);
            return Mono.empty();
        });
    }
}
